package com.mycompany.server;

import com.mycompany.client.GreetingService;
import com.mycompany.shared.FieldVerifier;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
		GreetingService {

	
	GerenciadorUsuarios x = new GerenciadorUsuarios();
	
	
	public String greetServer(String input) throws IllegalArgumentException {
		// Verify that the input is valid. 
		if (!FieldVerifier.isValidName(input)) {
			// If the input is not valid, throw an IllegalArgumentException back to
			// the client.
			throw new IllegalArgumentException(
					"Name must be at least 4 characters long");
		}

		String serverInfo = getServletContext().getServerInfo();
		String userAgent = getThreadLocalRequest().getHeader("User-Agent");

		// Escape data from the client to avoid cross-site script vulnerabilities.
		input = escapeHtml(input);
		userAgent = escapeHtml(userAgent);

		return "Hello, " + input + "!<br><br>I am running " + serverInfo
				+ ".<br><br>It looks like you are using:<br>" + userAgent;
	}

	/**
	 * Escape an html string. Escaping data received from the client helps to
	 * prevent cross-site script vulnerabilities.
	 * 
	 * @param html the html string to escape
	 * @return the escaped string
	 */
	private String escapeHtml(String html) {
		if (html == null) {
			return null;
		}
		return html.replaceAll("&", "&amp;").replaceAll("<", "&lt;")
				.replaceAll(">", "&gt;");
	}

	
	
	
	//---------------//--------------------//----------------//---------------
	
	/**
	 * Zera o sistema
	 */
	public void zerarSistema() {
		
	}

	
	public void encerrarSistema() {
		// TODO tem que salvar os dados dos usuarios em algum local
	}
	
	/**
	 * Responsavel por aprovar amizade entre dois usuarios
	 * @param idSessao Sessao do usuario 
	 * @param login Login do usuario
	 * @throws Exception Caso idSessao ou login sejam invalidos
	 */
	public void aprovarAmizade(String idSessao, String login) throws Exception {
		this.x
				.buscarUsuarioPorID(idSessao)
				.getGerenciadorAmizades()
				.adicionarAmigo(
						x.buscarUsuarioPorLogin(login));
		this.x
				.buscarUsuarioPorLogin(login)
				.getGerenciadorAmizades()
				.adicionarNovoAmigo(
						x.buscarUsuarioPorID(idSessao));
		this.x.adicionarAtividadesUsuario(idSessao, login, "amizade");

	}
	
	/**
	 * Responsavel pelas requisicoes de amizade entre dois usuarios
	 * @param idSessao IdSessao do usuario
	 * @return IdRequisicao de amizade
	 * @throws Exception Caso a idSessao seja invalida
	 */
	public String getRequisicoesDeAmizade(String idSessao) throws Exception {
		return this.x.buscarUsuarioPorID(idSessao)
				.getGerenciadorAmizades().getRequisicoesDeAmizade();
	}
	/**
	 * Responsavel por verificar se dois usuarios sao amigos
	 * @param idSessao IdSessao do usuario
	 * @param login Login do usuario
	 * @return true se forem amigos ou false caso contrario
	 * @throws Exception Caso idSessao ou login sejam invalidos
	 */
	public String ehAmigo(String idSessao, String login) throws Exception {
		if (this.x
				.buscarUsuarioPorID(idSessao)
				.getGerenciadorAmizades()
				.ehMeuAmigo(
						x.buscarUsuarioPorLogin(login))) {
			return "true";
		} else {
			return "false";
		}

	}
	/**
	 * Responsavel por requisitar amizade entre dois usuarios
	 * @param idSessao IdSessao do usuario
	 * @param login Login do usuario
	 * @throws Exception Caso idSessao ou login sejam invalidos
	 */
	public void requisitarAmizade(String idSessao, String login)
			throws Exception {
		x.buscarUsuarioPorID(idSessao);
		this.x
				.buscarUsuarioPorLogin(login)
				.getGerenciadorAmizades()
				.adicionarProvavelAmigo(
						x.buscarUsuarioPorID(idSessao));
	}

	public String localizarUsuario(String idSessao, String chave, String atributo) throws Exception {
		return x.localizarUsuario(idSessao, chave,
				atributo);
	}
	
	public String localizarUsuario(String idSessao)throws Exception{
		return this.x.localizarUsuario(idSessao);
	}

	public String getAtributoItem(String idItem, String atributo)throws Exception {
		return this.x.getAtributoItem(idItem, atributo);		
	}

	public String cadastrarItem(String idSessao, String nome, String descricao, String categoria) throws Exception {
		Usuario usuario = x.buscarUsuarioPorID(idSessao);
		String resposta = x.cadastrarItem(usuario, nome, descricao, categoria);
		x.adicionarAtividadesUsuario(idSessao, new Item(nome, descricao, categoria), "item");
		
		return resposta;
	}

	public void criarUsuario(String login, String nome, String endereco)throws Exception {
		x.criarUsuario(login, nome, endereco);
	}

	public String abrirSessao(String login) throws Exception {
		Usuario usr = x.buscarUsuarioPorLogin(login);
		
		return x.abrirSessao(usr);
	}

	public String getAtributoUsuario(String login, String atributo) throws Exception {
		return x.getAtributoUsuario(login, atributo);
	}
	
	public String getAmigos(String idSessao) throws Exception {
		Usuario usuario = x.buscarUsuarioPorID(idSessao);
		
		return x.getAmigos(usuario);
	}

	public String getAmigos(String idSessao, String login) throws Exception {		
		x.buscarUsuarioPorID(idSessao);
		Usuario usuario2 = x.buscarUsuarioPorLogin(login);
		
		return x.getAmigos(usuario2);
	}

	public String getItens(String idSessao) throws Exception {
		Usuario usuario = x.buscarUsuarioPorID(idSessao);
		
		return x.getItens(usuario);
	}

	public String getItens(String idSessao, String login) throws Exception {
		Usuario usuario = x.buscarUsuarioPorID(idSessao);
		Usuario usuario2 = x.buscarUsuarioPorLogin(login);
		
		return x.getItens(usuario, usuario2);
	}
	
	public String requisitarEmprestimo(String idSessao, String idItem, int dias) throws Exception {
		Usuario usuario = x.buscarUsuarioPorID(idSessao);
		Item item = x.buscarItemPorID(idItem);
		
		return x.requisitarEmprestimo(usuario, item, dias);
	}
	
	public String getEmprestimos(String idSessao, String tipo)throws Exception{
		return this.x.getEmprestimos(idSessao, tipo);
	}
	
	public String aprovarEmprestimo(String idSessao, String idRequisicaoEmprestimo)throws Exception{
		return this.x.aprovarEmprestimo(idSessao, idRequisicaoEmprestimo);
	}
	
	
	public void devolverItem(String idSessao, String idEmprestimo) throws Exception{
		Usuario usuario = this.x.buscarUsuarioPorID(idSessao);
		Usuario usuario2 = this.x.buscarUsuarioBeneficiador(idEmprestimo);
		Item item = this.x.buscarItemIdEmprestimo(idEmprestimo);
		
		x.devolverItem(usuario, usuario2, item);	
	}
	
	public void confirmarTerminoEmprestimo(String idSessao, String idEmprestimo) throws Exception{
		Usuario usuario2 = this.x.buscarUsuarioPorID(idSessao);
		this.x.buscarUsuarioBeneficiador(idEmprestimo);
		Item item = this.x.buscarItemIdEmprestimo(idEmprestimo);
		
		x.confirmarTerminoEmprestimo(usuario2, item);
		x.adicionarAtividadesUsuario(idSessao, item, "terminoEmprestimo");
	}
	
	public String enviarMensagem (String idSessao, String destinatario, String assunto, String mensagem) throws Exception{
		return x.enviarMensagem(idSessao, destinatario, assunto, mensagem);
	}
	
	public String enviarMensagem (String idSessao, String destinatario, String assunto, String mensagem, String idRequisicaoEmprestimo) throws Exception{
		return this.x.enviarMensagem(idSessao, destinatario, assunto, mensagem, idRequisicaoEmprestimo);
		
	}
	
	public String lerTopicos (String idSessao, String tipo) throws Exception{	
		return this.x.buscarUsuarioPorID(idSessao).getGerenciadorMensagens().lerTopicos(tipo);
	}
	
	public String lerMensagens (String idSessao, String idTopico) throws Exception{
		return this.x.lerMensagens(idSessao, idTopico);
	}
	
	public void requisitarDevolucao(String idSessao, String idEmprestimo) throws Exception{
		this.x.requisitarDevolucao(idSessao, idEmprestimo);
	}
		
	public void adicionarDias(int dias){
		this.x.simularPassagemDoTempo(dias);
	}
	
	public void registrarInteresse(String idSessao, String idItem) throws Exception{
		Usuario usuario = this.x.buscarUsuarioPorID(idSessao);
		this.x.registrarInteresse(usuario, idSessao, idItem);
	}
	
	public String pesquisarItem (String idSessao, String chave, String atributo, String tipoOrdenacao, String criterioOrdenacao) throws Exception{
		return this.x.pesquisarItem(this.x.buscarUsuarioPorID(idSessao) ,chave, atributo, tipoOrdenacao, criterioOrdenacao);
	}
	
	public void desfazerAmizade (String idSessao, String loginAmigo) throws Exception{
		Usuario	usuario = this.x.buscarUsuarioPorID(idSessao);
		Usuario	usuario2 = this.x.buscarUsuarioPorLogin(loginAmigo);
		this.x.desfazerAmizade(usuario, usuario2);
	} 
	
	public void apagarItem (String idSessao, String idItem) throws Exception{
		this.x.apagarItem(idSessao, idItem);
	}
	
	public String getRanking(String idSessao, String categoria) throws Exception{
		return this.x.getRanking(idSessao, categoria);
	}
	
	public String historicoAtividades(String idSessao) throws Exception{
		return x.historicoAtividades(idSessao);
	}
	
	public String historicoAtividadesConjunto(String idSessao) throws Exception{	
		return this.x.historicoAtividadesConjunto(idSessao);
	}
	
	public String publicarPedido (String idSessao, String nomeItem, String descricaoItem) throws Exception{
		Usuario usuario = this.x.buscarUsuarioPorID(idSessao);
		return this.x.publicarPedido(usuario, nomeItem, descricaoItem);
	}
	
	public void oferecerItem (String idSessao, String idPublicacaoPedido, String idItem) throws Exception{
		Usuario usuario = this.x.buscarUsuarioPorID(idSessao);
		this.x.oferecerItem(usuario, idPublicacaoPedido, idItem);
	}
	
	public void rePublicarPedido (String idSessao, String idPublicacaoPedido) throws Exception{
		PedidoItem pedido = x.buscarPedido(idPublicacaoPedido);
		Usuario usuario = x.buscarUsuarioPorID(idSessao);
		this.x.rePublicarPedido(usuario, pedido);
	}

	
}
